Python 
Python教程1 
official::Python教程 
反编译 
text::数据结构与算法  
 
 
〇、基本概念 
静态语言 编译 先编译再执行 例:C
脚本语言 解释 边编译边执行 例:python
 
1 pyCharm 
设置中文:File——Setting——Plugins——Chinese (Simplified) Language Pack
 
 
pyCharm快速添加引号:     1. ctrl + r     2. 上方填入(.*?):(.*),选择正则表达式     3. 下方填入'$1':'$2' 
 
2 类型 
不可变数据类型:Number、String、Tuple。
可变数据类型:List、Dictionary、Set。
可变数据类型在值变化后地址不会改变。不可变数据类型在值变化后会重新开辟空间并修改地址。
 
3 常见语句 
print:使用   参数设置 
pass / …的用法 
todo:待做。pyCharm中点击下方todo可以看到所有todo。
 
''' 输出 格式:print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) objects -- 复数,表示可以一次输出多个对象。输出多个对象时,需要用 , 分隔。 sep -- 用来间隔多个对象,默认值是一个空格。 end -- 用来设定以什么结尾。默认值是换行符 \n,我们可以换成其他字符串。 file -- 要写入的文件对象。 flush -- 输出是否被缓存通常决定于 file,但如果 flush 关键字参数为 True,流会被强制刷新。 输出百分号的方法:%% ''' print (1 )input ()eval ('str' )del  variable[index]__init__  __doc__  match  num:         case  1 :         case  2 :     case  _:              print ( val := function() , val ** 2  )if  (length := len (string)) > 10 :    pass  
 
 
4 常用函数 isinstance  (a,int )isinstance  (a,str )isinstance  (a,(str ,int ,list )) quotient , remainder = divmod ( dividend , divisor ) ord ('A' )chr (65 )
 
5 内存 lst1 = [2 ,3 ] lst2 = [1 ,4 ,5 ,2 ] print (id (lst1[0 ]) == id (lst2[3 ])) 
 
 
二、字符串 1 普通函数 
字符串函数      格式化输出  
 
str .format (args)s.split(sep,[ num ]) s.strip(["str" ]) s.lstrip(["str" ])  s.rstrip(["str" ])  "" .join(seq)s.isdigit() : s.count("str" ) s.index("str" ) s.replace(old, new[, max ]) s = s[::] 
 
2 字符串前的符号 u"str" r"str" b"str" f"str" lst= [1 ,2 ,3 ] print (lst, f'has a length of {len (lst)} .' )
 
 
三、列表与元组 1 列表 
普通函数 
浅拷贝和深拷贝 
 
list ()a = b  a = b.copy() a = b.deepcopy()  del (lst[index])lst.append(x)	 lst.extend(lst)	 lst.pop([index])  lst.sort(reverse=False )	 lst.reverse() lst.count(val) 
 
lst.sort(key=lambda  x:x[0 ]) 
 
2 元组 
元素不可被修改(列表可以用extend扩展)的列表(只可拼接):tuple()
括号可以省略。
当元组中只有一个元素时,逗号不可省略。( tup = (1,) )
map() 
zip() 
enumerate() 
 
map ()map (iter ,type )map (list ,int )zip ()zip (iter [,iter ...])zip (a,b)for  idx,num in  enumerate (lst):    print (idx,num) * + 可迭代对象 *zip (lst) def  is_value_in_nested_tuple (value, nested_tuple ):    for  item in  nested_tuple:         if  isinstance (item, tuple ):               if  is_value_in_nested_tuple(value, item):                 return  True          elif  item == value:               return  True      return  False    
 
 
四、字典与集合 1 字典 
键值对,dict()
Counter() 
 
dic.keys() dic.values() dic.items() dic.get(key,default) dic.pop(key,default) dic.popitem() dic.clear() dic.copy()/.deepcopy() dic.update(dicts2) dic.get(key, default=None ) key in  dicts 
 
dic2 = {value: key for  key, value in  dic1.items()} max ( dic ) max ( dic.values() )dic[ max (dic) ] max ( dic, key=dic.get)max ( dic,key=lambda  x:len (dic[x])) lst = [ [ key,value ] , ... ] dic = dict ( lst ) *dic **dic 
 
from  collections import  Countera = Counter() b = Counter('chenkc' ) c = Counter({'a' :1 , 'b' :2 , 'c' :3 }) d = Counter(a = 1 , b = 2 , c = 3 ) dic = collections.defaultdict(list ) collections.deque() 
 
2 集合 
数学集合,set()
 
S.discard(x) S.remove(x)   S.isdisjoint(T) res = set1 & set2 res = set1.intersection(set2) res = set1 | set2 res set1.union(set2) res = set1 - set2 res = set1.difference(set2) res = set1 ^ set2 res = set1.symmetric_difference(set2) subset_check = set1 in  set2 subset_check = set1.issubset(set2) superset_check = set2 in  set1 superset_check = set1.issuperset(set2)   
 
 
五、函数 1 变量范围 a = 10  def  func ():    global  a     a = 15  func() print (a) def  outer ():    x = 10      def  inner ():         nonlocal  x         x = 20      inner()     print (x)  outer() 
 
2 自定义函数 
函数参数:args 
字符串方式访问函数 
 
def  funcname  (paras:types)->types :    statements     [return [expression]] def  func ():    def  new_func ():         pass      new_func()     def  test (a,b )test (1 ,2 ) def  test (a,b )test (b=1 ,a=2 ) def  test  (a,b=2 )test (1 ) def  test  ( name, *args , **kwargs ):    pass  eval ( str  )()
 
def  fun (a=( ),b=[] ):    a += (1 ,)     b.append(1 )     return  a,b fun() print (fun())''' 输出:((1,), [1, 1]) Python的默认参数只在函数定义时被赋值一次,而不会每次调用函数时又创建新的引用。 元组不可修改 所以调用了两次函数,第二次元组初始也是空元组,所以只有一个元素。 ''' def  fn ():    t = []     i = 0      while  i < 2 :         t.append(lambda  x: print (i*x,end="," ))         i += 1      return  t for  f in  fn():    f(2 ) ''' 输出:4,4, 因为在for的时候fn中的循环先被执行完了,此时i = 2,然后再调用print函数。 ''' 
 
3 yield 
yield 的作用就是把一个函数变成一个 generator。
在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值。
 
def  jie (now ):    count = 1      for  i in  range (1 , now + 1 ):         count *= i         yield  i         yield  count jar = jie(10 ) for  i in  jar :    print ("{}:" .format (i), end = "" )     i = jar.__next__()     print ("{}" .format (i)) 
 
4 匿名函数 lambda parameters : expression
cnt = Counter(barcodes) barcodes.sort(key=lambda  x: (-cnt[x], x)) 
 
5 常用函数 
any()     all()  
 
abs (num)round (num)quotient,remainder = divmod ( dividend , divisor )  
 
int (str , base=10 )  hex () bin () chr () ord () 
 
any (iter )all (iter )filter (function,iter )reduce(function,iter [,init]) 
 
6 装饰器 
装饰器 
多个装饰器从下往上调用。
定义:在函数调用前先调用闭包的函数,参数传递是传给是闭包的函数。
@cache 装饰器 :一种装饰在被执行的函数上,将其执行的结果缓存起来的缓存装饰器。当下次请求的时候,如果请求该函数的传参未变则直接返回缓存起来的结果而不再执行函数。
@property :装饰函数后,该函数会变成属性且变为只读,使用时不用带括号,函数没有参数。
 
def  Do_Add (ad ):    def  Add (a,b ):         print ("hello" )         c = ad(a,b)         print ("value:%d" %c)     return  Add def  ad (a,b ):    c = a + b     return  c myfunc = Do_Add(ad) myfunc(5 ,6 ) @Do_Add def  ad (a,b ):    c = a + b     return  c ad(1 ,2 ) 
 
def  get_func_name (func ):    def  wrapper (*args, **kwargs ):         print (f"Calling function: {func.__name__} " )         result = func(*args, **kwargs)         return  result     return  wrapper @get_func_name def  add (a, b ):    print (a + b) add(1 , 2 ) def  log_decorator (log_level='INFO'  ):    def  decorator (func ):         def  wrapper (*args, **kwargs ):             print (f"{log_level} : Entering function {func.__name__} ()" )             result = func(*args, **kwargs)             print ("result:" ,end=" " )             print (result)             print (f"{log_level} : Exiting function {func.__name__} ()" )             return  result         return  wrapper     return  decorator @log_decorator(log_level='INFO'  ) def  multiply (a, b ):    print (1 )     return  a * b multiply(5 , 4 ) 
 
@property def  name (self ):    return  self._name @name.setter def  name (self, value ):    self._name = value 
 
 
六、类与对象 1 定义 
变量:
类变量可以通过类名加变量名访问,也可以通过对象名加变量名访问。在实例化对象后,若类变量没有修改过值,通过类名加变量名修改类变量值将会同时作用于类和对象。若类变量修改过值,类变量相当于变成了实例变量,通过类名加变量名的方式将不会再修改对象类变量值。后续实例化对象后实例出的类变量值则是实例化最新的变量值。
方法:
成员方法:带参self,可以访问类变量和成员变量,可以用对象名访问。 
普通方法:任意参,可以访问类变量和成员变量,可以用对象名和类名访问。 
类方法:类方法装饰器@classmethod,参数cls,可以访问类变量,可以用对象名和类名访问。 
静态方法:静态方法装饰器@staticmethod,无参,不可以访问类变量和成员变量,可以用对象名和类名访问。 
 
 
class  MyClass :         class_var = "This is a class variable"      def  __init__ (self, instance_var ):                  self.instance_var = instance_var 	     def  common_method ():         print ("This is an common method" )              def  instance_method (self ):         print ("This is an instance method" )         print ("Accessing instance variable:" , self.instance_var)         print ("Accessing class variable:" , self.class_var)     @classmethod     def  class_method (cls ):         print ("This is a class method" )         print ("Accessing class variable:" , cls.class_var)     @staticmethod     def  static_method ():         print ("This is a static method" )                   class  Base (object ):    count = 0      def  __init__ (self ):         pass       b1 = Base() b2 = Base() b1.count = b1.count + 200  print (b1.count," " ,Base.count," " ,b2.count)Base.count = Base.count + 5  print (b1.count," " ,Base.count," " ,b2.count)b2.count = b2.count + 100  print (b1.count," " ,Base.count," " ,b2.count)Base.count = Base.count + 50  print (b1.count," " ,Base.count," " ,b2.count)b3 = Base() print (b1.count," " ,Base.count," " ,b2.count," " ,b3.count)
 
2 方法参数 
对象:self
类:cls的使用 
私有参数:__name
 
class  Dog :    def  __init__ (self ):         self.age = 6              def  my_print (self ):         print (self.age)                   class  MyClass :    def  __init__ (self, name ):         self.name = name     @classmethod     def  create (cls, name ):         obj = cls(name)         return  obj     def  display (self ):         print ("Name:" , self.name) my_obj = MyClass.create("Alice" ) my_obj.display()   class  NewClass :    def  __init__ (self ):         self.__name = "1"  new = NewClass() print (new._NewClass__name)
 
3 高级特效 
继承的规则:如果有单个父类,则直接继承;如果有多个父类,则按照顺序从左到右依次继承
所有的类默认继承object类,object是python中所有类的基类
super().father_function()调用父类方法
方法重写:子类重写和父类同名同参的方法后,系统在调用时将调用子类重写后的方法
 
class  Animal :    def  __init__ (self, name ):         self.name = name     def  speak (self ):         print (f"{self.name}  is making a sound." ) class  Dog (Animal ):    def  __init__ (self, name, breed ):         super ().__init__(name)         self.breed = breed     def  speak (self ):         print (f"{self.name}  is barking." ) animal = Animal("Generic Animal" ) animal.speak()   dog = Dog("Buddy" , "Labrador" ) dog.speak()   
 
4 魔法方法 
__new__是一个类级别方法(classmethod),它在对象实例化之前被调用。它负责创建并返回实例对象,在实例化过程中是第一个被调用的方法。它的主要作用是控制对象的创建过程,也就是创建一个空类。
__init__是一个实例级别方法(instancemethod),它在对象实例化之后被调用。它用于初始化实例的属性,并在对象创建后进行额外的设置,也就是初始化数据。
对于new和init区别:
__new__是一个静态方法,而__init__是一个实例方法 
__new__方法会返回一个创建的实例,而__init__什么都不返回 
只有在__new__返回一个cls的实例时,后面的__init__才能被调用 
当创建一个新实例时调用__new__,初始化一个实例时用__init__ 
 
常用魔术方法 
 
魔术方法名 
作用 
 
 
__new__() 
初始化对象 
 
__init__() 
初始化对象内容 
 
__del__() 
删除对象 
 
__str__() 
对象的字符串表示 
 
__repr__() 
对象的非正式字符串表示 
 
__len__() 
返回对象的长度 
 
__call__() 
对象的可调用行为 
 
 
 
class  MyClass :    def  __new__ (cls, *args, **kwargs ):         print ("Creating instance using __new__" )         instance = super ().__new__(cls)         return  instance     def  __init__ (self, value ):         print ("Initializing instance using __init__" )         self.value = value obj = MyClass(10 ) 
 
5 重载 
类的重载:overload 
 
@typing.overload __init__():  @overload def  func ():           __add__ __sub__ __mul__ __div__ __mod__ __repr__、__str__  __getitem__ __setitem__ __delitem__ __contains__ __len__ __eq__、__ne__ __lt__、__le__ __gt__、__ge__ __iter__ __getattr__ __getattribute__ 
 
class  Vector :    def  __init__ (self, x, y ):         self.x = x         self.y = y          def  __add__ (self, other ):         if  isinstance (other, Vector):             new_x = self.x + other.x             new_y = self.y + other.y             return  Vector(new_x, new_y)         else :             raise  TypeError("Unsupported operand type: {} and {}" .format (type (self), type (other)))     def  __str__ (self ):         return  "({}, {})" .format (self.x, self.y) v1 = Vector(1 , 2 ) v2 = Vector(3 , 4 ) result = v1 + v2 print (result)  
 
6 接口 
在python中,若函数中存在:raise NotImplementedError("..."),那么子类必须要继承并重写这个函数。(类似接口、抽象类和抽象方法)
 
class  Father (object ):         def  f1 (self ):         raise  NotImplementedError(".f1() must be overridden" )          class  Child (Father ):         def  f1 (self ):         print ("Hello World" ) 
 
from  abc import  ABC, abstractmethodclass  Shape (ABC ):         @abstractmethod     def  area (self ):         pass  class  Circle (Shape ):    def  __init__ (self, radius ):         self.radius = radius     def  area (self ):         return  3.14  * self.radius * self.radius class  Animal (ABC ):         @abstractmethod     def  make_sound (self ):         pass  class  Dog (Animal ):    def  make_sound (self ):         return  "汪汪汪"  circle = Circle(5 ) print ("圆的面积:" , circle.area())  dog = Dog() print ("狗发出的声音:" , dog.make_sound())  
 
 
七、存储 1 开关文件 myfile = open  ( filename [ , mode ] [ , encoding= ] ) with  open () as  name ''' r/w/a:读写追加 b:二进制形式 +:以读/写方式打开 ''' myfile.close() myfile.flush() 
 
2 读写数据 read( [ size ] ) readline ( [ size ] ) readlines ( [ hint ] ) readable() write( str  ) writelines( seq_of_str ) writable() tell() seek( offset [ , whence ] ) pickle.dump( obj , file ) pickle.load( file ) 
 
3 os模块和os.path模块 abspath( path ) dirname( path ) exists( path ) getatime( path ) getmtime( path ) getsize( path ) isabs( path ) isdir( path ) isfile( path ) split( path ) splitext( path ) join( str  , ... ) os.getcwd() os.listdir( path ) os.remove( file ) os.removedirs( path ) os.rename( old , new ) os.mkdir( path ) os.stat( path ) 
 
4 CSV格式读写数据  
5 序列化 
序列化:把复杂的数据结构变成一连串的字节
反序列化:把一连串的字节变成复杂的数据结构
 
import  jsonjson.dump( data , fp , ensure_ascii=False  ) json.load( fp ) res = json.loads( str  ) import  pickle
 
 
八、异常 1 异常流程 try :except  [ ExceptionName ] [ as  e ]:   except  [ ExceptionName ]: else :finally :
 
2 异常类型 
异常名 
异常含义 
 
 
Exception 
所有异常 
 
BaseExcpettion 
所有异常的根异常 
 
GeneratorExit 
由生成器.close()方法引发 
 
KeyboardInterrupt 
由键盘中断(通常为Ctrl+C) 生成 
 
SystemExit 
程序退出/终止 
 
Exception 
所有非退出异常的基类 
 
StopIteration 
引发后可停止迭代 
 
StandardError 
所有内置异常的基类(仅在Python2中使用) 
 
ArithmeticError 
算数异常的基类 
 
FloatingPointError 
浮点操作失败 
 
ZeorDivisionError 
对0进行除或取模操作 
 
AssertionError 
由assert语句引发 
 
AttributeError 
当属性名称无效时引发 
 
EnviromentError 
发生在Python外部的错误 
 
IOError 
I/O或文件相关的错误 
 
OSError 
操作系统错误 
 
EOFError 
到达文件结尾时引发 
 
ImportError 
import语句失败 
 
LookupError 
索引和键错误 
 
IndexError 
超出序列索引的范围 
 
KeyError 
字键盘不存在 
 
MemoryError 
内存不足 
 
NameError 
无法找到局部或全局名称 
 
UnboundLocalError 
未绑定的局部变量 
 
ReferenceError 
销毁被引用对象后使用的弱引用 
 
RuntimeError 
一般运行时错误 
 
NotImplementedError 
没有实现的特性 
 
SystaxError 
解析错误 
 
IndentationError 
缩进错误 
 
TabError 
使用不一致的制表符(由-tt选项生成) 
 
SystemError 
解释器中的非致命系统错误 
 
TypeError 
给操作传递了错误的类型 
 
ValueError 
无效类型 
 
UnicodeError 
Unicode错误 
 
UnicodeDecondeError 
Unicode解码错误 
 
UnicodeEncodeError 
Unicode编码错误 
 
UnicodeTranslateError 
Unicode转换错误 
 
Warning 
警告的基类 
 
DeprecationWarning 
关于被弃用的特征的警告 
 
FutureWarning 
关于构造将来语义会有改变的警告 
 
OverflowWarning 
旧的关于自动提升为长整型(long)的警告 
 
PendingDeprecationWarning 
关于特性将会被废弃的警告 
 
RuntimeWarning 
可疑的运行时行为(runtime behavior)的警告 
 
SyntaxWarning 
可疑的语法的警告 
 
UserWarning 
用户代码生成的警告 
 
 
 
3 抛出异常 raise  [Exception [, args [, traceback]]]
 
4 断言 assert  expression [, arguments]import  sysassert  ('linux'  in  sys.platform), "该代码只能在 Linux 下执行" import  sysassert  ('win32'  in  sys.platform), "win32" 
 
5 自定义异常 class  UserDefinedException (Exception ):    def  __init__ (self, eid, message ):     self.eid = eid     self.message = message      class  ExceptionDemo  :    def  draw (self, number ):         print ("called compute("  + str (number) + ")" )     if  number > 500  or  number <= 0 :         raise  UserDefinedException(101 , "number out of bounds" )     else :         print ("normal exit" ) myobject = ExceptionDemo() try :    myobject.draw(125 )     myobject.draw(900 ) except  UserDefinedException as  e :    print ("Exception caught,id:{},message:{}" .format (e.eid, e.message)) 
 
 
九、导入包 1 包定义 
包中含有模块。(文件夹(包)里有  init .py(初始化文件),hello.py(模块))
模块中含有函数库和类库。(函数和类)
 
if  __name__ == "main" :    pass  elif  __name__ == "module_name" :    pass  
 
2 pip指令 
official::pip安装 
official::setuptools安装 
镜像源  
 
pip < command > [ options ] pip -help :帮助 pip install name:安装包 pip uninstall name:卸载包 pip show name:查看包 pip download name:下载但不安装包 pip list:查看所有安装包 # 使用豆瓣的镜像进行升级 python -m pip install --upgrade pip -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 
 
3 导入包 import  库 [as  alias]from  库 import  函数from  builtins import  list  as  List 
 
4 打包 
链接 
 
5 生成可执行文件 
链接 
 
pip install PyInstaller # 普通打包 pyinstaller -F myfile.py -i ico:装载图标(linux不行) # 窗口化应用程序作为单文件可执行文件 pyinstaller --onefile --windowed myfile.py 
 
6 标准库 
official::大全 
 
6.1 do_cmd import  oscmd = 'ipconfig /all'  res = os.popen(cmd) output_str = res.buffer.read().decode(encoding='GB2312' ) print (output_str)import  subprocessobj = subprocess.run(  cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True , timeout=1  ) print ( obj.stderr )  print ( obj.stdout )  
 
6.2 math 
 math库 
 
math.perm(m,n) == A(m,n)(例:A(5 ,3 ) 为 5  * 4  * 3 ) math.comb(m,n) == C(m,n) math.gcd(m,n) 
 
6.3 random 
random库 
 
random.random() random.randrange( start , end , step ) 
 
6.4 datetime 
 datetime库①     datetime库② 
 
import  datetimedatetime.date.today() datetime.date.fromtimestamp(num)  datetime.date.fromordinal(num) datetime.timedelta(days=num) now = datetime.datetime.strptime(date, '%Y-%m-%d' ).date() now += datetime.timedelta(1 ) 
 
6.5 turtle 
turtle库 
 
6.6 tkinter GUI 
 tkinter GUI库 
 
import  turtlet = turtle.Turtle() forward(n); backward(n)  left(a);right(a)  penup();pendown() pensize(s); pencolor(c) hideturtle() turtle.done() 
 
6.7 hashlib import  hashlibhashlib.func() obj = hashlib.md5() obj.update("Hello" .encode("utf-8" )) print (obj.hexdigest())
 
import  hmacimport  hashlibmac = hmac.new(b'key' ,b'hello' ,hashlib.md5) print (mac.digest()) print (mac.hexdigest()) 
 
6.8 结构化 
struct详解 
常用 fmt:
 
function 
return 
explain 
 
 
pack(fmt,v1,v2,…) 
string 
按格式把数据转化成字节流 
 
pack(fmt,buffer,offset,v1,v2,…) 
None 
写入以offset开始的buffer中 
 
unpack(fmt,v1,v2,…) 
tuple 
解包 
 
pack_from(fmt,buffer,offset) 
tuple 
以offset开始解包 
 
calcsize(fmt) 
size of fmt 
计算fmt占多少字节 
 
 
 
   
 
6.9 Urllib import  itertoolsitertools.count(start=0 ,step=1 ) 
 
7 三方库 
库导入 
 
7.1 pygame 
导弹追踪 
 
7.2 pymssql 
流程:
链接数据库。 
新建游标。 
执行 sql 操作,用 try,except,无异常数据提交,有异常回滚。 
关闭数据库。 
 
 
con = pymsssql.Connect(host,port,user,password,db) cursor = con.cursor() cursor.execute('sql' ) con.commit() con.rollback() cursor / con.close() 
 
7.3 jieba 
jieba库 
 
7.4 cloudwords 
cloudwords库 
 
7.5 flask 
Flask Web 
 
from  flask import  Flaskapp = Flask(__name__) @app.route('/'  ) def  index_main ():    return  'Hello World'  @app.route('/bobo'  ) def  index_bobo ():    return  'Hello bobo'  @app.errorhandler(404  ) def  page_error (error ):    return  "page not found"  if  __name__ == '__main__' :    app.run() 	 	      @app.route('/'  ) def  index_main ():    return  render_template('site.html' ) 
 
7.6 Django 
text::Django 
 
8 生成requirement 
生成:pip freeze > requirements.txt
安装:pip install -r requirements.txt
 
 
十、Python高级 
text::PyQt5 
 
 
十一、高级用法 
text::PyQt5 
text::Python爬虫  
text::Python渗透